<?php

namespace Framework;

/**
 * 会话管理类
 * 提供会话开始/设置/获取/检查/清楚单个项目和所有会话数据的功能。
 */
class Session
{
    /**
     * 开启会话
     * 如果会话尚未开始，则开始一个新的会话
     * 
     * @return void 无返回值
     */
    public static function start()
    {
        if(session_status()==PHP_SESSION_NONE){
            session_start();
        }
    }

    /**
     * 设置会话键值对
     * 将值存储在指定的会话键下
     * 
     * @param string $key 会话键名
     * @param mixed $value 要存储的值
     * @return void 无返回值
     */
    public static function set($key,$value)
    {
        $_SESSION[$key]=$value;
    }

    /**
     * 通过键获取对话值
     * 如果指定的值存在，则返回其值，如果不存在，返回默认值。
     * 
     * @param string $key 会话键名
     * @param mixed $default 如果键不存在时返回的默认值
     * @return mixed 返回会话键对应的值或默认值
     */
    public static function get($key,$default=null){
        return isset($_SESSION[$key]) ? $_SESSION[$key] : $default;
    }

    /**
     * 检查会话值是否存在
     * 判断指定的键是否在会话中已设置。
     * 
     * @param string $key 会话键名
     * @return bool 返回键是否存在的布尔值
     */
    public static function has($key)
    {
        return isset($_SESSION[$key]);
    }

    /**
     * 清除指定的会话值
     * 如果键存在，则从会话中移除。
     * 
     * @param string $key 会话键名
     * @return void 无返回值
     */
    public static function clear($key)
    {
        if(isset($_SESSION[$key])){
            unset($_SESSION[$key]);
        }
    }

    /**
     * 清除所有会话记录
     * 结束会话并清除所有以存储的数据
     * 
     * @return void 无返回值
     */
    public static function clearAll()
    {
        session_unset();
        session_destroy();
    }

    /**
     * 设置闪存消息
     * 闪存消息用户在一个请求中设置信息
     * 
     * @param string $key 消息的键
     * @param string $message 要存储的消息内容
     * @return void 无返回值
     */
    public static function setFlashMessage($key,$message){
        //调用set方法将消息存储在会话中
        self::set('flash_' . $key,$message);
    }

    /**
     * 获取闪存消息并在获取后立即删除
     * 这确保了消息只能被读取一次
     * 
     * @param string $key
     * @param mixed $default
     * @return string
     */
    public static function getFlashMessage($key,$default=null){
        //从会话中获取消息
        $message=self::get('flash_' . $key,$default);
        //删除会话中的消息，读取一次
        self::clear('flash_' . $key);
        return $message;
    }

}